/**
 * 
 */
package de.midnightdance.admin.vorteile;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

import de.cbf.util.ui.editentities.interfaces.IEditableEntity;
import de.cbf.util.ui.editentities.template.AbstractCompositeEditEntity;
import de.midnightdance.admin.ws.entities.VorteilDB;

/**
 * @author Surfer
 *
 */
public class CompositeEditVorteil extends AbstractCompositeEditEntity{
	private Text 	txtName;
	private Text 	txtPunkte;
	private Text 	txtLimitiert;
	//
	private Button 	btnStartJa;
	private Button 	btnStartNein;
	private Button 	btnSterblichJa;
	private Button 	btnSterblichNein;
	
	private ModifiedNameAdvancer 		modifiedName		; 
	private ModifiedPunkteAdvancer 		modifiedPunkte 		;
	private ModifiedLimitiertAdvancer	modifiedLimitiert	;
	private ModifiedStartAdvancer 		modifiedStart 		;
	private ModifiedSterblichAdvancer 	modifiedSterblich	;
	
	private EnterNumbers enterNumbers;

	public CompositeEditVorteil(Composite parent, int style) {
		super(parent, style);			
	}
	
	/* (non-Javadoc)
	 * @see de.cbf.util.ui.editentities.template.AbstractCompositeEditEntity#setEnabled(boolean)
	 */
	@Override
	public void setEnabled(boolean enabled) {		
		txtName			.setEnabled(enabled);
		txtPunkte		.setEnabled(enabled);
		txtLimitiert	.setEnabled(enabled);
		btnStartJa		.setEnabled(enabled);
		btnStartNein	.setEnabled(enabled);
		btnSterblichJa	.setEnabled(enabled);
		btnSterblichNein.setEnabled(enabled);
		super.setEnabled(enabled);
	}
	
	
	@Override
	protected boolean checkEntity(IEditableEntity value) {
		return (value instanceof VorteilDB); 
	}

	@Override
	protected Composite createCompositeEntity(Composite parent) {
		//build listeners
		modifiedName 		= new ModifiedNameAdvancer();
		modifiedPunkte 		= new ModifiedPunkteAdvancer();
		modifiedLimitiert 	= new ModifiedLimitiertAdvancer();
		modifiedStart 		= new ModifiedStartAdvancer();
		modifiedSterblich 	= new ModifiedSterblichAdvancer();
		//
		enterNumbers = new EnterNumbers();
		//
		Composite main = new Composite(parent, SWT.NONE);
		//
		main.setLayout(new GridLayout(2, false));
		
		Label lblVorteilEditieren = new Label(main, SWT.NONE);
		lblVorteilEditieren.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
		lblVorteilEditieren.setText("VorteilDB editieren:");
		
		Label lblName = new Label(main, SWT.NONE);
		lblName.setText("Name:");
		
		txtName = new Text(main, SWT.BORDER);
		GridData gd_txtName = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
		gd_txtName.widthHint = 60;
		txtName.setLayoutData(gd_txtName);		
		
		Label lblPunkte = new Label(main, SWT.NONE);
		lblPunkte.setText("Punkte:");
		
		txtPunkte = new Text(main, SWT.BORDER);
		GridData gd_textPunkte = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
		gd_textPunkte.widthHint = 20;
		txtPunkte.setLayoutData(gd_textPunkte);		
		
		Label lblStart = new Label(main, SWT.NONE);
		lblStart.setText("start?");
						
		Composite cmpStart = new Composite(main, SWT.NONE);
		cmpStart.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1));
		GridLayout gl_cmpStart = new GridLayout(2, false);
		gl_cmpStart.marginHeight = 2;
		cmpStart.setLayout(gl_cmpStart);
			btnStartJa = new Button(cmpStart, SWT.RADIO);
			btnStartJa.setSize(30, 16);
			btnStartJa.setText("ja");						
			btnStartNein = new Button(cmpStart, SWT.RADIO);
			btnStartNein.setText("nein");			
			
		Label lblSterblich = new Label(main, SWT.NONE);
		lblSterblich.setSize(50, 15);
		lblSterblich.setText("sterblich?");		
		
		Composite cmpSterblich = new Composite(main, SWT.NONE);
		cmpSterblich.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1));
		GridLayout gl_cmpSterblich = new GridLayout(2, false);
		gl_cmpSterblich.marginHeight = 2;
		cmpSterblich.setLayout(gl_cmpSterblich);		
			btnSterblichJa = new Button(cmpSterblich, SWT.RADIO);
			btnSterblichJa.setSize(30, 16);
			btnSterblichJa.setText("ja");				
			btnSterblichNein = new Button(cmpSterblich, SWT.RADIO);
			btnSterblichNein.setText("nein");			
			
		Label lblLimitiert = new Label(main, SWT.NONE);
		lblLimitiert.setSize(46, 15);
		lblLimitiert.setText("limitiert?");
		
		txtLimitiert = new Text(main, SWT.BORDER);
		GridData gd_txtLimitiert = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
		gd_txtLimitiert.widthHint = 20;
		txtLimitiert.setLayoutData(gd_txtLimitiert);
		//
		initUI();
		registerListeners();
		//
		return main;
	}
	private void initUI() {
		txtName			.setText("");
		txtPunkte		.setText("");
		txtLimitiert	.setText("");
		btnSterblichJa	.setSelection(false);
		btnSterblichNein.setSelection( true);
		btnStartJa		.setSelection(false);
		btnStartNein	.setSelection( true);
	}
	private void registerListeners() {	
		txtName			.addModifyListener		(modifiedName);
		txtPunkte		.addModifyListener		(modifiedPunkte);
		txtLimitiert	.addModifyListener		(modifiedLimitiert);
		txtPunkte		.addVerifyListener		(enterNumbers);
		txtLimitiert	.addVerifyListener		(enterNumbers);
		btnStartJa		.addSelectionListener	(modifiedStart);
		btnSterblichJa	.addSelectionListener	(modifiedSterblich);		
	}

	@Override
	public void clear() {
		setVorteilName("");
		setPunkte(0);
		setLimitiert(0);
		setStart(false);
		setSterblich(false);		
	}
	
	@Override
	protected void setEntityData(IEditableEntity value) {
		if (value instanceof VorteilDB) {
			VorteilDB vorteilDB = (VorteilDB) value;
			setVorteil(vorteilDB);
		}
		
	}	
	
	public VorteilDB getVorteilData(VorteilDB vorteilDB){
		vorteilDB.setName(getVorteilName());
		vorteilDB.setPunkte(getPunkte());
		vorteilDB.setLimitiert(getLimitiert());
		vorteilDB.setStart(getStart());
		vorteilDB.setSterblich(getSterblich());
		return vorteilDB;
	}
	
	public void setVorteil(VorteilDB vorteilDB){
		setVorteilName		(vorteilDB.getName());
		setPunkte	(vorteilDB.getPunkte());
		setLimitiert(vorteilDB.getLimitiert());
		setStart	(vorteilDB.isStart());
		setSterblich(vorteilDB.isSterblich());
	}
	
	public String getVorteilName(){
		return txtName.getText();
	}	
	public void setVorteilName(String name){
		Point selection = txtName.getSelection();
		txtName.setText(name);
		txtName.setSelection(selection);
	}
	
	public Integer getPunkte(){		
		Integer result = 0;
		try{
			 result = Integer.parseInt(txtPunkte.getText());
		}catch (NumberFormatException exc) {			
		}		
		return result;
	}	
	public void setPunkte(Integer punkte){
		Point selection = txtPunkte.getSelection();
		String test = punkte.toString();
		txtPunkte.setText(test);
		test = txtPunkte.getText();
		txtPunkte.setSelection(selection);		
	}
	
	public Integer getLimitiert(){		
		Integer result = 0;
		try{
			result = Integer.parseInt(txtLimitiert.getText());
		}catch (NumberFormatException exc) {			
		}
		return result;
	}	
	public void setLimitiert(Integer limitiert){
		Point selection = txtLimitiert.getSelection();
		txtLimitiert.setText(limitiert.toString());
		txtLimitiert.setSelection(selection);
	}
	
	public boolean getStart(){
		return btnStartJa.getSelection();
	}	
	public void setStart(boolean start){
		btnStartJa	.setSelection(	 start);
		btnStartNein.setSelection( ! start);
	}
	
	public boolean getSterblich(){
		return btnSterblichJa.getSelection();
	}	
	public void setSterblich(boolean sterblich){
		btnSterblichJa	.setSelection(	 sterblich);
		btnSterblichNein.setSelection( ! sterblich);
	}

	
	private Collection<ActionListener> modifiedNameListeners = new ArrayList<ActionListener>();
	public boolean registerModifiedNameListener(ActionListener listener){
		return modifiedNameListeners.add(listener);
	}
	public boolean deRegisterModifiedNameListener(ActionListener listener){
		return modifiedNameListeners.remove(listener);
	}
	
	private class ModifiedNameAdvancer implements ModifyListener{		
		@Override
		public void modifyText(ModifyEvent e) {
			ActionEvent event = new ActionEvent(CompositeEditVorteil.this, ActionEvent.ACTION_PERFORMED, "modifiedName");
			for (ActionListener listener : modifiedNameListeners) {
				listener.actionPerformed(event);
			}
		}		
	}
	private Collection<ActionListener> modifiedPunkteListeners = new ArrayList<ActionListener>();
	public boolean registerModfiedPunkteListener(ActionListener listener){
		return modifiedPunkteListeners.add(listener);
	}
	public boolean deRegisterModfiedPunkteListener(ActionListener listener){
		return modifiedPunkteListeners.remove(listener);
	}	
	private class ModifiedPunkteAdvancer implements ModifyListener{
		
		@Override
		public void modifyText(ModifyEvent e) {
			ActionEvent event = new ActionEvent(CompositeEditVorteil.this, ActionEvent.ACTION_PERFORMED, "ModifiedPunkte");
			for (ActionListener listener : modifiedPunkteListeners) {
				listener.actionPerformed(event);
			}
		}		
	}
	private Collection<ActionListener> modifiedLimitiertListeners = new ArrayList<ActionListener>();
	public boolean registerModifiedLimitiertListener(ActionListener listener){
		return modifiedLimitiertListeners.add(listener);
	}
	public boolean deRegisterModifiedLimitiertListener(ActionListener listener){
		return modifiedLimitiertListeners.remove(listener);
	}
	
	private class ModifiedLimitiertAdvancer implements ModifyListener{
		@Override
		public void modifyText(ModifyEvent e) {
			ActionEvent event = new ActionEvent(CompositeEditVorteil.this, ActionEvent.ACTION_PERFORMED, "ModifiedLimitiert");
			for (ActionListener listener : modifiedLimitiertListeners) {
				listener.actionPerformed(event);
			}
		}		
	}
	private Collection<ActionListener> modifiedStartListeners = new ArrayList<ActionListener>();
	public boolean registerModifiedStartListener(ActionListener listener){
		return modifiedStartListeners.add(listener);
	}
	public boolean deRegisterModifiedStartListener(ActionListener listener){
		return modifiedStartListeners.remove(listener);
	}
	
	private class ModifiedStartAdvancer extends SelectionAdapter{
		@Override
		public void widgetSelected(SelectionEvent e) {
			ActionEvent event = new ActionEvent(CompositeEditVorteil.this, ActionEvent.ACTION_PERFORMED, "ModifiedStart");
			for (ActionListener listener : modifiedStartListeners) {
				listener.actionPerformed(event);
			}
		}		
	}
	private Collection<ActionListener> modifiedSterblichListeners = new ArrayList<ActionListener>();
	public boolean registerModifiedSterblichListener(ActionListener listener){
		return modifiedSterblichListeners.add(listener);
	}
	public boolean deRegisterModifiedSterblichListener(ActionListener listener){
		return modifiedSterblichListeners.remove(listener);
	}
	
	private class ModifiedSterblichAdvancer extends SelectionAdapter{
		@Override
		public void widgetSelected(SelectionEvent e) {
			ActionEvent event = new ActionEvent(CompositeEditVorteil.this, ActionEvent.ACTION_PERFORMED, "ModifiedSterblich");
			for (ActionListener listener : modifiedSterblichListeners) {
				listener.actionPerformed(event);
			}
		}		
	}
	
	private class EnterNumbers implements VerifyListener{
		@Override
		public void verifyText(VerifyEvent e) {			
			String string = e.text;
			char[] chars = new char[string.length()];
			string.getChars(0, chars.length, chars, 0);
			for (int i = 0; i < chars.length; i++) {
				if (!('0' <= chars[i] && chars[i] <= '9')) {
					e.doit = false;
					return;
				}
			}			
		}		
	}

	
}
